﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Reflection;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using NHibernate;
using NHibernate.Cfg;
using System.Data.Common;
using System.Text;
using System.Text.RegularExpressions;


public class GastoControl
{
    Gasto g = new Gasto();

	public GastoControl()
	{
		//
		// TODO: Add constructor logic here
		//
	}

    public global::Gasto Gasto
    {
        get
        {
            throw new System.NotImplementedException();
        }
        set
        {
        }
    }

    // <summary>
    //Metodo que se encarga de buscar los gastos en la base de datos segun dos fechas
    //pasadas por parametros
    //
    //Parametros: la fecha inicial y final de la busqueda (en String)
    // </summary>

    public virtual List<Gasto> GastoPorFecha(String fechaInicio, String fechaFin)
    {
        List<Gasto> tablaGastos = new List<Gasto>();
        ISession session = NHibernateControl.GetCurrentSession();
        NHibernateControl nhm = new NHibernateControl();
        ITransaction tx = session.Transaction;

        tx.Begin();

        try
        {
            IQuery q1 = session.CreateQuery("from Gasto g where g.Status <> 0 and g.Fecha between :fechaInicio and :fechaFin");
            q1.SetParameter("fechaInicio", DateTime.Parse(fechaInicio));
            q1.SetParameter("fechaFin", DateTime.Parse(fechaFin));
            //q1.SetDateTime("fechaInicio", fechaInicio);
            //q1.SetDateTime("fechaFin", fechaFin);
            if (q1 != null)
                tablaGastos = (List<Gasto>)q1.List<Gasto>();
            else
                tablaGastos = null;

        }
        catch (HibernateException e)
        {
            Console.Write(e.Message);
            tx.Rollback();
        }

        session.Close();
        NHibernateControl.CloseSessionFactory();


        return tablaGastos;
    }

    // <summary>
    //Metodo que se encarga de buscar los gastos en la base de datos segun 
    //el parametro 'year' que contiene el año de busqueda
    //
    //Parametros: año de la busqueda (en String)
    // </summary>

    public virtual List<Gasto> GastoPorYear(String year)
    {
        List<Gasto> tablaGastos = new List<Gasto>();
        String fechaInicio = "01/01/" + year + " 00:00:00";
        String fechaFin = "31/12/" + year + " 00:00:00";

        ISession session = NHibernateControl.GetCurrentSession();
        NHibernateControl nhm = new NHibernateControl();
        ITransaction tx = session.Transaction;

        tx.Begin();

        try
        {
            IQuery q1 = session.CreateQuery("from Gasto g where g.Status <> 0 and g.Fecha between :fechaInicio and :fechaFin");
            q1.SetParameter("fechaInicio", DateTime.Parse(fechaInicio));
            q1.SetParameter("fechaFin", DateTime.Parse(fechaFin));
            //q1.SetDateTime("fechaInicio", fechaInicio);
            //q1.SetDateTime("fechaFin", fechaFin);
            if (q1 != null)
                tablaGastos = (List<Gasto>)q1.List<Gasto>();
            else
                tablaGastos = null;

        }
        catch (HibernateException e)
        {
            Console.Write(e.Message);
            tx.Rollback();
        }

        session.Close();
        NHibernateControl.CloseSessionFactory();


        return tablaGastos;
    }

    // <summary>
    //Metodo que se encargar de ingresar en la BD los datos correspondiente a un gasto
    //parametros de entrada, Droplist de tipo de gasto, TextBox Descipcion del gasto, 
    //TextBox Fecha del Gasto, TextBox monto, TextBox Propuesta, TextBox Proyecto,
    //DropList Satus.
    // </summary>
    
    public void IngresarGasto(System.Web.UI.WebControls.DropDownList DropDownList1, 
        System.Web.UI.WebControls.TextBox TexBox1, System.Web.UI.WebControls.TextBox 
        Date3, System.Web.UI.WebControls.TextBox TextBox4, System.Web.UI.WebControls.TextBox TextBox5,
        System.Web.UI.WebControls.TextBox TextBox6, System.Web.UI.WebControls.DropDownList DropDownList3)
    {
        float monto;
        int status;
        
        Gasto nuevogasto = new Gasto();
        Propuesta propuesta = new Propuesta();
        PropuestaControl propuestacontrol = new PropuestaControl();

        propuesta=propuestacontrol.BuscarPropuestaCodigo(TextBox6.Text);
       
            nuevogasto.Propuesta = propuesta;

            status = Convert.ToInt32(DropDownList3.SelectedValue);
            status = int.Parse(DropDownList3.SelectedItem.Value);
            nuevogasto.Status = status;
            monto = float.Parse(TextBox4.Text);
            nuevogasto.Monto = monto;
            nuevogasto.Tipo = DropDownList1.SelectedItem.Text;
            nuevogasto.Descripcion = TexBox1.Text;
            nuevogasto.Fecha = DateTime.Parse(Date3.Text);
            nuevogasto.Proyecto = TextBox5.Text;

            ISession session = NHibernateControl.GetCurrentSession();
            ITransaction tx = session.BeginTransaction();


            session.Save(nuevogasto);

            tx.Commit();
            NHibernateControl.CloseSession();
        
    }

    // <summary>
    //Metodo que se encarga de obtener una lista de todos los objetos tipo Gasto
    //de la tabla Gasto
    // </summary>
   
    public IList GetGasto()
    {
        IList gastos = null;
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        gastos = session.CreateCriteria(typeof(Gasto)).List();

        session.Flush();
        NHibernateControl.CloseSession();

        return gastos;
    }

    // <summary>
    //Metodo que se encarga de buscar los objetos tipo gasto y mostrar el resultado 
    //en un GridView
    //Parametros del metodo Un GridView en el cual se mostraran los resultados 
    //de la busqueda y un TextBox con el texto que se desea buscar
    // </summary>
    
    public void buscar_gasto(GridView GridView1, TextBox parametro)
    {
        IList gastos = new ArrayList();
        string query=parametro.Text;
        gastos=this.Consulta_Gasto(query);
        GridView1.DataSource = gastos;
        GridView1.DataBind();
        
    }

    // <summary>
    //Metodo que se encarga de buscar los objetos Gasto dentro de lalista de objetos 
    // gastos que retorna el metodo GetGasto
    //Parametro: una variable tipo Strin con la palabra o texto de referencia 
    //para realizar la busqueda
    // </summary>
    
    public IList Consulta_Gasto(String parametro) {

        IList gastos = this.GetGasto();
        IList resultado = new ArrayList();
        foreach (Gasto gasto in gastos)
        {
            if (gasto.Descripcion == parametro)
                resultado.Add(gasto);
            else if (gasto.Tipo == parametro)
               resultado.Add(gasto);
            else if (gasto.Proyecto == parametro)
                resultado.Add(gasto);
        }

        return resultado;
    }

    // <summary>
    //Metodo que se encarga de buscar los detalles de un Gasto y mostrarlos por pantalla 
    //(Consulta de un  Gasto en especifico)
    //Parametros: int con el id del gasto, 7 TextBox para mostrar los detalles del Gasto.
    // </summary>
    
    public void DetalleGasto(int id, TextBox tex1, TextBox tex2, TextBox tex3, 
        TextBox tex4, TextBox tex5, TextBox tex7,TextBox tex8) { 
        IList gastos = this.GetGasto();
        Gasto resultado = new Gasto();
        foreach (Gasto gasto in gastos)
        {
            if (gasto.Id == id)
                resultado=gasto;
        }
        tex1.Text = resultado.Tipo;
        tex2.Text = resultado.Descripcion;
        tex3.Text = Convert.ToString(resultado.Fecha);
        tex4.Text = Convert.ToString (resultado.Monto);
        tex5.Text = resultado.Proyecto;
        tex7.Text = Convert.ToString(resultado.Status);
        tex8.Text = Convert.ToString(resultado.Propuesta.Id);

    }

    // <summary>
    //Metodo que se encarga de modificar los detalles de un gasto
    //Parametro: El obeto Gasto que se desea modificar
    // </summary>
   
    public bool ModificarGasto(Gasto gasto)
    {
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        session.Update(gasto);

        tx.Commit();
        NHibernateControl.CloseSession();

        return true;
    }

    // <summary>
    //Metodo que se encarga de pasar el valor de un gasto para la Consulta de este
    //Parametro: El objeto Gasto que se desea modificar
    // </summary>
    public void MostrarGasto(int id, Label tex1, Label tex2, Label tex3,
                Label tex4, Label tex5, Label tex6)
    {
        IList gastos = this.GetGasto();
        Gasto resultado = new Gasto();
        foreach (Gasto gasto in gastos)
        {
            if (gasto.Id == id)
                resultado = gasto;
        }
        tex1.Text = resultado.Tipo;
        tex2.Text = resultado.Descripcion;
        tex3.Text = Convert.ToString(resultado.Fecha);
        tex4.Text = Convert.ToString(resultado.Monto);
        tex5.Text = resultado.Proyecto;
        tex6.Text = Convert.ToString(resultado.Status);
     }

}
